package com.iflytek.sbd.demo.spi;


import java.util.Iterator;
import java.util.ServiceLoader;

/**
 * @program: sbd
 * @description:测试spi机制
 * @author: 陈英俊
 * @create: 2021-12-27 17:16
 */
public class SpiTest {

    /**
     * SPI:服务发现机制,META-INFO.service
     * 体供服务和服务实现,采用哪个实现由文件里的全限定类名决定
     * 实现条件:
     * resource下构建META-INF/services文件夹
     * 文件名必须是接口的全限定类名称
     * 里面的实现类也必须是全限定类名
     * <p>
     * 结果:
     * 这里操作的话, 是根据资源目录下面文件里的实现类决定的,
     * 文件里是啥实现类,接口就调用啥实现类,
     * 文件里有几个实现类,接口就调用几个实现类
     * <p>
     * <p>
     * 缺陷：
     * 不能按需加载，需要遍历实现所有的实现，并且实例化，然后再循环里面找到我们需要的实现，造成了浪费
     * 获取实现类的方式不够灵活，只能通过iterator形式获取,不能通过参数获取
     * 并发的时候ServiceLoader的实现是不安全的
     *
     * @param args
     */
    public static void main(String[] args) {
        ServiceLoader<Search> service = ServiceLoader.load(Search.class);
        Iterator<Search> s = service.iterator();
        // s.hasNext()搜索接口,以及资源文件下配置的所有实现类,没有实例化
        while (s.hasNext()) {
            // 实例化实现类
            Search search = s.next();
            search.searchDoc("八嘎雅鹿");
        }
    }
}
